/* main.c */

#include "app_inc.h"

void MyDelayMs(uint32_t ms)
{
    uint32_t i, j;
    
    for (i = 0U; i < ms; i++)
    {
        for (j = 0U; j < 60000; j++)
        {
            __ASM("NOP");
        }
    }
}

int main(void)
{
    /* Initialize the board. */
    BSP_InitSystem();
    BSP_InitStdioUART(115200);
    BSP_InitLEDGPIO();
    BSP_InitKeyGPIO();
    
    printf("\r\nBlinky_Key Project.\r\n");

    /* Led. */
    GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    GPIO_SetPinDir(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
    GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    GPIO_SetPinDir(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
    GPIO_SetPinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    GPIO_SetPinDir(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN, true);
    /* Key. */
    GPIO_SetPinDir(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN, false);
    GPIO_SetPinDir(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN, false);
    
    printf("Press Key1/2 to switch on the Led1/2 ...\r\n");
    printf("Type anything into terminal to toggle the Led3\r\n");
    
    /* Enable the interrupt for UART0 Rx. */
    NVIC_EnableIRQ(UART0_RX_TX_IRQn);
    UART_SetIntEnabledOnRxBufferFull(UART0, true);
    
    while (1)
    {
        /* Key1 -> Led1. */
        if (!GPIO_GetPinLogic(BSP_GPIO_KEY1_PORT, BSP_GPIO_KEY1_PIN)) /* Key down. */
        {
            GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, false);
            MyDelayMs(1000U);
        }
        else /* Key up. */
        {
            GPIO_SetPinLogic(BSP_GPIO_LED1_PORT, BSP_GPIO_LED1_PIN, true);
        }
        /* Key2 -> Led2. */
        if (!GPIO_GetPinLogic(BSP_GPIO_KEY2_PORT, BSP_GPIO_KEY2_PIN)) /* Key down. */
        {
            GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, false);
        }
        else /* Key up. */
        {
            GPIO_SetPinLogic(BSP_GPIO_LED2_PORT, BSP_GPIO_LED2_PIN, true);
        }
    }
}

/* ISR for UART0 */
void UART0_RX_TX_IRQHandler(void)
{
    volatile uint8_t tmp8;
    /* ISR for RX. */
    if (UART_IsRxBufferFull(UART0))
    {
        tmp8 = UART_GetRxData(UART0); /* Read rx data to clear rx flag. */
        
        /* Toggle the Led3. */
        GPIO_TogglePinLogic(BSP_GPIO_LED3_PORT, BSP_GPIO_LED3_PIN);
    }
}

/* EOF. */

